use crate::{
    core::{
        input::Input,  // 处理输入
        manager::Manager,   // 管理文件系统浏览
        select::Select,  // 处理选择操作
        tasks::Tasks, // 管理后台任务
        Position // 表示界面元素的位置
    }, 
    misc::tty_size
};

pub struct Ctx {
    pub cursor: Option<(u16, u16)>,  // 可选的光标位置  

    pub manager: Manager, // 文件管理器 
    pub select:  Select, // 选择器 
    pub input:   Input, // 输入框 
    pub tasks:   Tasks, // 任务管理器
}

impl Ctx {
    pub fn new() -> Self {
        Self {
            cursor: None,

            manager: Manager::new(),  // 创建新的文件管理器 
            select:  Select::default(), // 使用默认配置初始化选择器和输入框
            input:   Input::default(), 
            tasks:   Tasks::start(), // 启动任务管理器
        }
    }

    pub fn position(&self, pos: Position) -> Position {
        match pos {
            Position::Top => Position::Coords((tty_size().ws_col / 2).saturating_sub(25), 2),
            Position::Hovered => self
                .manager
                .hovered()
                .and_then(|h| self.manager.current().rect_current(&h.path))
                .map(|r| Position::Coords(r.x, r.y))
                .unwrap_or_else(|| self.position(Position::Top)),
            p @  Position::Coords(..) => p,
        }
    }
}
